class Student:  # Student为类的名称（类名），由一个或多个单词组成，每个单词首字母大写，其余小写(这是建议，你不遵守也没事)
    native_pace = '高邮'

    def __init__(self, name, age):  # __init__初始化方法就是java中的构造方法
        self.name = name
        self.age = age  # slef就相当于java中的this

    # 实例方法(类外定义的称为函数，类之内的叫方法)
    def eat(self):
        print('学生在吃饭')

    def drink(self):
        print('学生在喝水')

    # 静态方法
    @staticmethod
    def method():
        print('我是静态方法')  # 用staticmethod修饰的就是静态方法

    @classmethod
    def cm(cls):
        print('我是类方法')  # 用classmethod修饰的就是类方法


# 创建student类对象
stu = Student('张三', 20)
stu.eat()  # 打印学生在吃饭
print(stu.name)  # 打印张三
print(stu.age)  # 打印20

Student.eat(stu)  # 打印学生在吃饭，这行代码和stu.eat功能相同，都是调用Student中的eat方法
#  类名.方法名(类的对象) -->相当于是方法定义处的self

# 类属性：类中，方法外的变量称为类属性，被该类的所有对象共享
print(Student.native_pace)  # 打印高邮
stu1 = Student('李四', 21)
stu2 = Student('王五', 20)
print(stu1.native_pace)  # 打印高邮
print(stu2.native_pace)  # 打印高邮
Student.native_pace = '苏州'
print(stu1.native_pace)  # 打印苏州
print(stu2.native_pace)  # 打印苏州

# 类方法：使用@classmethod修饰的方法，使用类名直接访问的方法
Student.cm()

# 静态方法：使用@staticmethod修饰的主法，使用类名直接访问的方法
Student.method()
# 类方法有默认参数，静态方法没有任何参数
